package bancosys.tec.security;

import javax.security.auth.Subject;

/**
 * Gerencia os usuários logados na aplicação.
 * 
 * @author Marco
 * @param <C> contexto em que são executadas as operações de segurança
 */
public interface SecurityManager<C> {

    /**
     * Recupera o usuário associado ao contexto.
     * 
     * @param context context
     * @return usuário.
     * @throws SecurityException SecurityException
     */
    Subject loadSubject(C context) throws SecurityException;

    /**
     * Devolve o securityservice.
     * 
     * @return securityservice.
     */
    SecurityService getSecurityService();

    /**
     * Efetua o login, carregando o subject
     * 
     * @param username nome do usuario
     * @param password senha
     * @param context context
     * @return Subject ou null se nao foi possivel autenticar
     * @throws SecurityException caso tenha ocorrido alguma falha durante a autenticação
     */
    Subject login(String username, String password, C context) throws SecurityException;

    /**
     * Efetua o logout, eliminando do contexto o estado de login
     * 
     * @param context context
     */
    void logout(C context);

    /**
     * Armazena o subject no contexto
     * 
     * @param context context
     * @param subject {@link Subject}
     */
    void storeSubject(C context, Subject subject);
}
